#ifndef CACHE_H
#define CACHE_H

#include<iostream>
#include<vector>
#include<iomanip>
#include<fstream>
#include<algorithm>
using namespace std;

// 代表地址中的tag和index部分
#define tag_index pair<unsigned, unsigned>

// Cache类，表示缓存系统的模拟
class Cache{
private:
    unsigned blockSize, size, assoc;               // 缓存的块大小、总大小和相联度

    // 定义缓存块Block的结构体
    struct Block{
        unsigned countBlock, tag;                  // 块计数器和tag
        bool dirty, valid;                         // 脏位标识和有效位标识

        // 重载小于运算符，用于块的LRU替换策略
        bool operator< (const Block& t)const {return countBlock < t.countBlock;}
    };                                             
    
    vector<vector<Block>> cache_set;               // 模拟缓存组的二维数组，每一组包含多个缓存块
    vector<Block> vic_cache;                       // 受害者缓存，用于存储被替换的缓存块
    Cache* nextLevel = nullptr;                    // 指向下一级缓存（如L2缓存）的指针
    string trace_file;                             // 追踪文件名，记录缓存操作
    unsigned totalReads, missReads, totalWrites, missWrites, swap, writeBack; // 缓存统计信息

public:
    // 构造函数，初始化缓存的各项参数
    Cache(unsigned blockSize, unsigned size, unsigned assoc, Cache* nextLevel, unsigned vicSize, string file); 

    // 开始运行缓存模拟
    void Run();                                                         
    
    // 地址转换函数，将内存地址分解为tag和index
    tag_index Addr_translation(unsigned address);                      
    
    // 访问地址并根据操作类型（读或写）进行处理
    void Visit(unsigned address, char op);                             
    
    // 缓存替换策略函数
    void Replace(unsigned address, char op);                           
    
    // 输出缓存的结果和统计信息
    void PrintResult();                                               
};

#endif
